package com.qf.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

/**
 * @author 千峰教育
 * @Company http://www.mobiletrain.org/
 * @Version 1.0
 */
@Component
@RabbitListener(queues = "boot-queue2")
public class QueueListener2 {

    @Autowired
    StringRedisTemplate template;

    @RabbitHandler
    public void onMessage(String msg, Channel channel, Message message) throws IOException {
        String messageId = (String) message.getMessageProperties().getHeaders().get("spring_returned_message_correlation");

        /**
         * 如果redis中不存在此 messageId， 说明此消息没有消费者，正常消费即可
         */
        if( template.opsForValue().setIfAbsent(messageId, "0", 5, TimeUnit.MINUTES) ){
            System.out.println("队列1："+msg);
            template.opsForValue().set(messageId, "1");
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        }else{
            String s = template.opsForValue().get(messageId);
            //如果messageId对应的值为 0 ，说明正在被消费，什么都不需要做
            //如果messageId对应的值为 1 ，说明消费成功，手动ack
            if("1".equalsIgnoreCase(s)){
                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            }
        }
        //        System.out.println("message --- 2:" + msg);
//        try {
//            System.out.println(1/0);
//            //参数1 ： 消息的唯一标识
//            //参数2：  是否开启批量处理
//            channel.basicAck(message.getMessageProperties().getDeliveryTag() , false);
//        } catch (Exception e){
//            e.printStackTrace();
//            //参数1: 消息的唯一标识
//            //参数2： 失败后当前消费者是否拒绝消费
//            //参数3： 失败后是否回到原队列
//            try {
//                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
//            } catch (IOException e1) {
//                e1.printStackTrace();
//            }
//        }
    }
}
